package com.zys.el.upload.utils;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class AliyunSTSToken {

    // STS接入地址，例如sts.cn-hangzhou.aliyuncs.com
    @Value("${oss.aliyun.endpoint}")
    private String endpoint;

    // 生成的RAM用户访问密钥AccessKey ID和AccessKey Secret
    @Value("${oss.aliyun.accessKeyId}")
    private String accessKeyId;
    // 生成的RAM用户访问密钥AccessKey ID和AccessKey Secret
    @Value("${oss.aliyun.accessKeySecret}")
    private String accessKeySecret;

    // 填写步骤3获取的角色ARN。
    @Value("${oss.aliyun.roleArn}")
    private String roleArn;

    // 自定义角色会话名称，用来区分不同的令牌，例如可填写为SessionTest
    @Value("${oss.aliyun.roleSessionName}")
    private String roleSessionName;


    public Map<String, String> getSTS() {
        // 以下Policy用于限制仅允许使用临时访问凭证向目标存储空间examplebucket上传文件。
        // 临时访问凭证最后获得的权限是步骤4设置的角色权限和该Policy设置权限的交集，即仅允许将文件上传至目标存储空间examplebucket下的exampledir目录。
        // 如果policy为空，则用户将获得该角色下所有权限。
//        String policy = "{\n" +
//                "    \"Version\": \"1\", \n" +
//                "    \"Statement\": [\n" +
//                "        {\n" +
//                "            \"Action\": [\n" +
//                "                \"oss:PutObject\"\n" +
//                "            ], \n" +
//                "            \"Resource\": [\n" +
//                "                \"acs:oss:*:*:duegin/*\" \n" +
//                "            ], \n" +
//                "            \"Effect\": \"Allow\"\n" +
//                "        }\n" +
//                "    ]\n" +
//                "}";
        // 设置临时访问凭证的有效时间为3600秒。
        Long durationSeconds = 3600L;
        HashMap<String, String> res = new HashMap<>();
        try {
            // regionId表示RAM的地域ID。以华东1（杭州）地域为例，regionID填写为cn-hangzhou。也可以保留默认值，默认值为空字符串（""）。
            String regionId = "";
            // 添加endpoint。适用于Java SDK 3.12.0及以上版本。
            DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
            // 添加endpoint。适用于Java SDK 3.12.0以下版本。
            // DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
            // 构造default profile。
            IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            // 构造client。
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            // 适用于Java SDK 3.12.0及以上版本。
            request.setSysMethod(MethodType.POST);
            // 适用于Java SDK 3.12.0以下版本。
//            request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
//            request.setPolicy(policy);
            request.setDurationSeconds(durationSeconds);
            final AssumeRoleResponse response = client.getAcsResponse(request);

            String tmpAccessKeyId = response.getCredentials().getAccessKeyId();
            String tmpAccessKeySecret = response.getCredentials().getAccessKeySecret();
            String tmpSecurityToken = response.getCredentials().getSecurityToken();

            res.put("accessKeyId", tmpAccessKeyId);
            res.put("accessKeySecret", tmpAccessKeySecret);
            res.put("securityToken", tmpSecurityToken);

            log.debug("Expiration: " + response.getCredentials().getExpiration());
            log.debug("Access Key Id: " + tmpAccessKeyId);
            log.debug("Access Key Secret: " + tmpAccessKeySecret);
            log.debug("Security Token: " + tmpSecurityToken);
            log.debug("RequestId: " + response.getRequestId());
        } catch (ClientException e) {
            log.debug("Failed：");
            log.debug("Error code: " + e.getErrCode());
            log.debug("Error message: " + e.getErrMsg());
            log.debug("RequestId: " + e.getRequestId());
        }
        return res;
    }

}
